#include "ModuleLabelST.h"

void ModuleLabel_ST::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);
	sb_radius=new QSpinBox(win);
	sb_radius->setPrefix("radius=");
	sb_radius->setRange(0,100);	

	sb_delay=new QSpinBox(win);
	sb_delay->setPrefix("delay=");
	sb_delay->setRange(0,100);	

	sb_dtds=new QSpinBox(win);
	sb_dtds->setPrefix("dt<-->ds=");
	sb_dtds->setRange(0,100);	
	
	layout->addWidget(sb_radius);
	layout->addWidget(sb_delay);
	layout->addWidget(sb_dtds);	
}
////////////////////////////////////////////////////////////////////////////////
void ModuleLabel_ST::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleLabel_ST::process()
{
	//si le buffer est plein
	if((int)keyspoints_fifo.size()>=sb_delay->value())
	{		
		cvLabelizeKeyspointsCubeST(keyspoints_fifo,sb_dtds->value(),sb_radius->value());
		return keyspoints_fifo.front();
	}
	else
	{
		result.release();
		return result;
	}	
}
////////////////////////////////////////////////////////////////////////////////
void ModuleLabel_ST::setInput(int n,const cv::Mat & m)
{
	if(n==0)
	{	
		temp=m.clone();
		temp.col(6).setTo(-1.0);
		keyspoints_fifo.push_back(temp);
		while((int)keyspoints_fifo.size()>(sb_delay->value()+1))
		{
			keyspoints_fifo.pop_front();
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleLabel_ST::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleLabel_ST::getName()
{
	return tr("Labelisation Spatio-Temporelle");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleLabel_ST::nbInputs()
{
	return 1;
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleLabel_ST::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==3)
	{
		sb_radius->setValue(list_params[0].toInt());
		sb_delay->setValue(list_params[1].toInt());
		sb_dtds->setValue(list_params[2].toInt());
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleLabel_ST::getParams()
{
	return QString::number(sb_radius->value())+tr(";")+
				 QString::number(sb_delay->value())+tr(";")+
				 QString::number(sb_dtds->value());
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleLabel_ST::help(int id)
{
	if(id==-2)
	{
		return trUtf8("Permet de labeliser spatio temporellement les points clefs en fonction d'un rayon.");
	}
	else if(id==-1)
	{
		return tr("keyspoints");
	}
	else if(id==0)
	{
		return tr("keyspoints");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModuleLabelST_plugin,ModuleLabel_ST);  
